/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.barbon.sudokuSoapDesktop;

import br.barbon.sudoku.model.entidade.Posicao;
import br.barbon.sudoku.model.entidade.Tabuleiro;
import br.barbon.sudoku.model.servico.PosicaoService;
import br.barbon.sudoku.model.servico.TabuleiroService;
import javax.jws.WebMethod;
import javax.jws.WebService;

/**
 *
 * @author Barbon
 */
@WebService
public class ResolvedorSoapDesktop {
    
    @WebMethod
    public Tabuleiro resolver(Tabuleiro tab){
        
        solve(0, 0, tab);
        
        return tab;
    }
    
    private boolean solve(int i, int j, Tabuleiro tab) {
        Posicao p;

        if (i == 10) {
            i = 1;
            if (++j == 10) {
                return true;
            }
        }

        p = tab.getPosicao().get(TabuleiroService.getChave(i, j));

        if (p.getValor() != 0) {
            return solve(i + 1, j, tab);
        }

        for (byte val = 1; val <= 9; ++val) {

            p.setValor(val);
                        
            if (!PosicaoService.haveraConflitantes(p)) {
                
                if (solve(i + 1, j, tab)) {
                    return true;
                }
            } else {
                p.setValor((byte) 0);
            }
        }
        p.setValor((byte) 0); // reset on backtrack
                
        return false;
    }
}
